import numpy as np
import image_io
from image_utils import logging


def split_image_channels(image):
    '''
    该函数用于分割图像的颜色通道
    :param image: 输入图像，numpy数组
    :return: 图像的颜色通道列表
    '''
    try:
        logging.info("开始分割图像颜色通道")
        
        # TODO: 1. 检测多通道图像 image 是否真多通道的，如果是，显示错误信息并返回
        # 提示: 使用 raise 抛出异常信息：图像通道数必须大于等于2import numpy as np
import image_io
from image_utils import logging


def split_image_channels(image):
    '''
    该函数用于分割图像的颜色通道
    :param image: 输入图像，numpy数组
    :return: 图像的颜色通道列表
    '''
    try:
        logging.info("开始分割图像颜色通道")
        
        # 验证输入图像
        if image is None:
            raise ValueError("输入图像不能为空")
            
        if len(image.shape) < 3 or image.shape[2] < 2:
            raise ValueError(f"图像通道数必须大于等于2，当前图像形状: {image.shape}")
        
        # 记录输入图像信息
        logging.info(f"输入图像形状: {image.shape}")
        logging.info(f"输入图像数据类型: {image.dtype}")
        
        # 分割通道
        channels = np.split(image, image.shape[2], axis=2)
        channel_list = [np.squeeze(ch) for ch in channels]
        
        # 记录分割结果
        logging.info(f"成功分割为 {len(channel_list)} 个通道")
        for i, ch in enumerate(channel_list):
            logging.info(f"通道 {i+1} 形状: {ch.shape}")
            
        return channel_list
    except Exception as e:
        logging.error(f"分割图像颜色通道时发生错误: {e}", exc_info=True)
        raise ValueError(f"分割图像颜色通道失败: {e}")

def merge_image_channels(file_paths):
    '''
    该函数用于合并多个单通道图像，创建一个多通道图像
    :param file_paths: 包含单通道图像文件路径的列表
    :return: 合并后的多通道图像
    '''
    try:
        logging.info("开始合并图像通道")
        
        # 验证输入参数
        if not file_paths:
            raise ValueError("文件路径列表不能为空")
            
        channels = []
        for i, path in enumerate(file_paths):
            # 加载图像
            img = image_io.load_image(path, as_gray=True)
            if img is None:
                raise ValueError(f"无法加载图像: {path}")
                
            # 验证图像
            if len(img.shape) != 2:
                raise ValueError(f"要合并的子图像必须是单通道图像: {path} (形状: {img.shape})")
                
            # 检查尺寸一致性
            if channels and img.shape != channels[0].shape:
                raise ValueError(f"所有图像必须具有相同尺寸，当前图像 {path} 尺寸 {img.shape} 与第一张图像尺寸 {channels[0].shape} 不匹配")
                
            channels.append(img)
            logging.info(f"已加载通道 {i+1}: {path} (尺寸: {img.shape})")
            
        # 合并通道
        merged_image = np.stack(channels, axis=2)
        
        # 记录合并结果
        logging.info(f"成功合并 {len(channels)} 个通道")
        logging.info(f"合并后图像形状: {merged_image.shape}")
        logging.info(f"合并后图像数据类型: {merged_image.dtype}")
        
        return merged_image
    except Exception as e:
        logging.error(f"合并图像通道时发生错误: {e}", exc_info=True)
        raise ValueError(f"合并图像通道失败: {e}")

        
        
        # TODO: 2. 使用numpy的split函数，沿着通道维度分割图像
        
        
        # TODO: 3. 把分割后的通道图像添加到一个列表 channel_list 中，注意要去掉多余的维度
        channel_list = 
        
        logging.info(f"成功分割图像颜色通道")
        return channel_list
    except Exception as e:
        # print(f"在分割图像颜色通道时发生错误: {e}")
        raise ValueError(f"在分割图像颜色通道时发生错误: {e}")

def merge_image_channels(file_paths):
    '''
    该函数用于合并多个单通道图像，创建一个多通道图像
    :param file_paths: 包含单通道图像文件路径的列表
    :return: 合并后的多通道图像
    '''
    try:
        logging.info("开始合并图像通道")
        
        # TODO: 想办法加载每个图像文件，然后将它们合并成一个多通道图像 merged_image
        # 注意: 检查每个图像是否是单通道的，如果不是，raise 一个异常信息: 要合并子图像必须是单通道图像，不能是多通道图像
        
        merged_image = 
        
        logging.info("成功合并图像通道")
        return merged_image
    except Exception as e:
        raise ValueError(f"在合并图像通道时发生错误: {e}")